#include <QCoreApplication>
#include <QMetaObject>
#include <QDebug>
#include <QMetaProperty>
#include <QMetaType>
//#include "student.h"

//int main(int argc, char *argv[])
//{
//    QCoreApplication a(argc, argv);
//    Student* st = new Student();

//    // 获取元对象
//    const QMetaObject* m_obj = st->metaObject();
//    qDebug() << "class name == " << m_obj->className();
//    qDebug() << "m_obj->propertyCount() == " << m_obj->propertyCount();
//    qDebug() << "m_obj->property(0) == " << m_obj->property(0).name();

//    st->setName("李四");
//    qDebug() << "st->getName() == " << st->getName();
//    // 通过元对象设置字段
//    st->setProperty("Name", "张三");
//    qDebug() << "st->getName() == " << st->getName();

//    for (int i = 0; i < m_obj->propertyCount(); i++) {
//        qDebug() << QString("m_obj->property(%1).name() == ").arg(i) << m_obj->property(i).name();
////        QMetaProperty pro = m_obj->property(i);
//    }

//    // 直接调用函数
//    st->func();

//    // 通过元对象调用函数
//    m_obj->invokeMethod(st, "func");

//    // 通过元对象创建一个类对象
//    QObject* st2 = m_obj->newInstance();
//    qDebug() << "st2->className() == " << st2->metaObject()->className();
//    return a.exec();
//}




// 不包含头文件直接使用元对象去创建Student对象
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // 通过名字去获得一个类型
    QMetaType meta_type = QMetaType::fromName("Student");
    const QMetaObject* m_obj = meta_type.metaObject();
    // 得到了元对象就可以创建类对象了
    QObject* st = m_obj->newInstance();



    return a.exec();
}
